{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.circuit.random import random_circuit\n",
    "from qiskit.visualization import plot_histogram\n",
    "\n",
    "from braket.tracking import Tracker\n",
    "\n",
    "from qiskit_braket_provider import BraketLocalBackend, BraketProvider, to_braket\n",
    "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n",
    "t = Tracker().start()\n",
    "\n",
    "os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    }
   ],
   "source": [
    "provider = BraketProvider()\n",
    "backends = provider.backends()\n",
    "print(backends)\n",
    "# print(provider.backends(\"Aria 1\"))\n",
    "\n",
    "# online_simulators_backends = provider.backends(statuses=[\"ONLINE\"], types=[\"SIMULATOR\"])\n",
    "# online_simulators_backends"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BraketBackend[default]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "local_simulator = BraketLocalBackend()\n",
    "local_simulator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "ename": "QiskitBackendNotFoundError",
     "evalue": "'No backend matches the criteria'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mQiskitBackendNotFoundError\u001b[0m                Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[9], line 8\u001b[0m\n\u001b[1;32m      3\u001b[0m provider \u001b[38;5;241m=\u001b[39m BraketProvider()\n\u001b[1;32m      5\u001b[0m \u001b[38;5;66;03m# devices\u001b[39;00m\n\u001b[1;32m      6\u001b[0m \u001b[38;5;66;03m# ionq_device = provider.get_backend(\"IonQ Device\")\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m rigetti_device \u001b[38;5;241m=\u001b[39m \u001b[43mprovider\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_backend\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mAspen-M-1\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m     10\u001b[0m oqc_device \u001b[38;5;241m=\u001b[39m provider\u001b[38;5;241m.\u001b[39mget_backend(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLucy\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit_braket_provider/providers/braket_provider.py:50\u001b[0m, in \u001b[0;36mBraketProvider.get_backend\u001b[0;34m(self, name, **kwargs)\u001b[0m\n\u001b[1;32m     46\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QiskitBackendNotFoundError(\n\u001b[1;32m     47\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMore than one backend matches the criteria\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m     48\u001b[0m     )\n\u001b[1;32m     49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m backends:\n\u001b[0;32m---> 50\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QiskitBackendNotFoundError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo backend matches the criteria\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m     51\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m backends[\u001b[38;5;241m0\u001b[39m]\n",
      "\u001b[0;31mQiskitBackendNotFoundError\u001b[0m: 'No backend matches the criteria'"
     ]
    }
   ],
   "source": [
    "from qiskit_braket_provider import BraketProvider\n",
    "\n",
    "provider = BraketProvider()\n",
    "\n",
    "# devices\n",
    "# ionq_device = provider.get_backend(\"IonQ Device\")\n",
    "\n",
    "rigetti_device = provider.get_backend(\"Aspen-M-1\")\n",
    "\n",
    "oqc_device = provider.get_backend(\"Lucy\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'us-east-1' for devices. Please check your settings or try again later. Continuing without devices in 'us-east-1'.\n",
      "  warnings.warn(\n",
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'us-west-1' for devices. Please check your settings or try again later. Continuing without devices in 'us-west-1'.\n",
      "  warnings.warn(\n",
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'us-west-2' for devices. Please check your settings or try again later. Continuing without devices in 'us-west-2'.\n",
      "  warnings.warn(\n",
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'eu-west-2' for devices. Please check your settings or try again later. Continuing without devices in 'eu-west-2'.\n",
      "  warnings.warn(\n",
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'eu-north-1' for devices. Please check your settings or try again later. Continuing without devices in 'eu-north-1'.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "ename": "QiskitBackendNotFoundError",
     "evalue": "'No backend matches the criteria'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mQiskitBackendNotFoundError\u001b[0m                Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m Aria_1 \u001b[38;5;241m=\u001b[39m \u001b[43mprovider\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_backend\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mAria 1\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit_braket_provider/providers/braket_provider.py:50\u001b[0m, in \u001b[0;36mBraketProvider.get_backend\u001b[0;34m(self, name, **kwargs)\u001b[0m\n\u001b[1;32m     46\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QiskitBackendNotFoundError(\n\u001b[1;32m     47\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMore than one backend matches the criteria\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m     48\u001b[0m     )\n\u001b[1;32m     49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m backends:\n\u001b[0;32m---> 50\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QiskitBackendNotFoundError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo backend matches the criteria\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m     51\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m backends[\u001b[38;5;241m0\u001b[39m]\n",
      "\u001b[0;31mQiskitBackendNotFoundError\u001b[0m: 'No backend matches the criteria'"
     ]
    }
   ],
   "source": [
    "Aria_1 = provider.get_backend(\"Aria 1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit.qasm3 import dumps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/beegfs/home/lungyi45/.conda/envs/qmg/lib/python3.10/site-packages/braket/aws/aws_device.py:660: UserWarning: AccessDeniedException: Unable to search region 'us-east-1' for devices. Please check your settings or try again later. Continuing without devices in 'us-east-1'.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "online_simulators_backends = provider.backends(statuses=[\"ONLINE\"], types=[\"SIMULATOR\"])\n",
    "online_simulators_backends"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "ename": "TranspilerError",
     "evalue": "\"The control-flow construct 'if_else' is not supported by the backend.\"",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTranspilerError\u001b[0m                           Traceback (most recent call last)",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/transpiler/passmanager.py:580\u001b[0m, in \u001b[0;36m_replace_error.<locals>.wrapper\u001b[0;34m(*meth_args, **meth_kwargs)\u001b[0m\n\u001b[1;32m    579\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 580\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmeth_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmeth_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    581\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m PassManagerError \u001b[38;5;28;01mas\u001b[39;00m ex:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/transpiler/passmanager.py:308\u001b[0m, in \u001b[0;36mPassManager.run\u001b[0;34m(self, circuits, output_name, callback)\u001b[0m\n\u001b[1;32m    307\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 308\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    309\u001b[0m \u001b[43m        \u001b[49m\u001b[43min_programs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcircuits\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    310\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    311\u001b[0m \u001b[43m        \u001b[49m\u001b[43moutput_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    312\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    313\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/passmanager.py:226\u001b[0m, in \u001b[0;36mBasePassManager.run\u001b[0;34m(self, in_programs, callback, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(in_programs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m should_run_in_parallel():\n\u001b[0;32m--> 226\u001b[0m     out \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m    227\u001b[0m         _run_workflow(program\u001b[38;5;241m=\u001b[39mprogram, pass_manager\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m, callback\u001b[38;5;241m=\u001b[39mcallback, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m    228\u001b[0m         \u001b[38;5;28;01mfor\u001b[39;00m program \u001b[38;5;129;01min\u001b[39;00m in_programs\n\u001b[1;32m    229\u001b[0m     ]\n\u001b[1;32m    230\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(in_programs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_list:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/passmanager.py:227\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    225\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(in_programs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m should_run_in_parallel():\n\u001b[1;32m    226\u001b[0m     out \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m--> 227\u001b[0m         \u001b[43m_run_workflow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprogram\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogram\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpass_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    228\u001b[0m         \u001b[38;5;28;01mfor\u001b[39;00m program \u001b[38;5;129;01min\u001b[39;00m in_programs\n\u001b[1;32m    229\u001b[0m     ]\n\u001b[1;32m    230\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(in_programs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_list:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/passmanager.py:286\u001b[0m, in \u001b[0;36m_run_workflow\u001b[0;34m(program, pass_manager, **kwargs)\u001b[0m\n\u001b[1;32m    282\u001b[0m passmanager_ir \u001b[38;5;241m=\u001b[39m pass_manager\u001b[38;5;241m.\u001b[39m_passmanager_frontend(\n\u001b[1;32m    283\u001b[0m     input_program\u001b[38;5;241m=\u001b[39mprogram,\n\u001b[1;32m    284\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m    285\u001b[0m )\n\u001b[0;32m--> 286\u001b[0m passmanager_ir, final_state \u001b[38;5;241m=\u001b[39m \u001b[43mflow_controller\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    287\u001b[0m \u001b[43m    \u001b[49m\u001b[43mpassmanager_ir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpassmanager_ir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    288\u001b[0m \u001b[43m    \u001b[49m\u001b[43mstate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mPassManagerState\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    289\u001b[0m \u001b[43m        \u001b[49m\u001b[43mworkflow_status\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minitial_status\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    290\u001b[0m \u001b[43m        \u001b[49m\u001b[43mproperty_set\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mPropertySet\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    291\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    292\u001b[0m \u001b[43m    \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcallback\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    293\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    294\u001b[0m \u001b[38;5;66;03m# The `property_set` has historically been returned as a mutable attribute on `PassManager`\u001b[39;00m\n\u001b[1;32m    295\u001b[0m \u001b[38;5;66;03m# This makes us non-reentrant (though `PassManager` would be dependent on its internal tasks to\u001b[39;00m\n\u001b[1;32m    296\u001b[0m \u001b[38;5;66;03m# be re-entrant if that was required), but is consistent with previous interfaces.  We're still\u001b[39;00m\n\u001b[1;32m    297\u001b[0m \u001b[38;5;66;03m# safe to be called in a serial loop, again assuming internal tasks are re-runnable.  The\u001b[39;00m\n\u001b[1;32m    298\u001b[0m \u001b[38;5;66;03m# conversion to the backend language is also allowed to use the property set, so it must be set\u001b[39;00m\n\u001b[1;32m    299\u001b[0m \u001b[38;5;66;03m# before calling it.\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/base_tasks.py:218\u001b[0m, in \u001b[0;36mBaseController.execute\u001b[0;34m(self, passmanager_ir, state, callback)\u001b[0m\n\u001b[1;32m    217\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 218\u001b[0m     passmanager_ir, state \u001b[38;5;241m=\u001b[39m \u001b[43mnext_task\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    219\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpassmanager_ir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpassmanager_ir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    220\u001b[0m \u001b[43m        \u001b[49m\u001b[43mstate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    221\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    222\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    223\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    224\u001b[0m         \u001b[38;5;66;03m# Sending the object through the generator implies the custom controllers\u001b[39;00m\n\u001b[1;32m    225\u001b[0m         \u001b[38;5;66;03m# can always rely on the latest data to choose the next task to run.\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/base_tasks.py:218\u001b[0m, in \u001b[0;36mBaseController.execute\u001b[0;34m(self, passmanager_ir, state, callback)\u001b[0m\n\u001b[1;32m    217\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 218\u001b[0m     passmanager_ir, state \u001b[38;5;241m=\u001b[39m \u001b[43mnext_task\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    219\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpassmanager_ir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpassmanager_ir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    220\u001b[0m \u001b[43m        \u001b[49m\u001b[43mstate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    221\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    222\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    223\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    224\u001b[0m         \u001b[38;5;66;03m# Sending the object through the generator implies the custom controllers\u001b[39;00m\n\u001b[1;32m    225\u001b[0m         \u001b[38;5;66;03m# can always rely on the latest data to choose the next task to run.\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/passmanager/base_tasks.py:98\u001b[0m, in \u001b[0;36mGenericPass.execute\u001b[0;34m(self, passmanager_ir, state, callback)\u001b[0m\n\u001b[1;32m     97\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m state\u001b[38;5;241m.\u001b[39mworkflow_status\u001b[38;5;241m.\u001b[39mcompleted_passes:\n\u001b[0;32m---> 98\u001b[0m     ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpassmanager_ir\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     99\u001b[0m     run_state \u001b[38;5;241m=\u001b[39m RunState\u001b[38;5;241m.\u001b[39mSUCCESS\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/transpiler/passes/utils/error.py:62\u001b[0m, in \u001b[0;36mError.run\u001b[0;34m(self, _)\u001b[0m\n\u001b[1;32m     61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maction \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraise\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 62\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m TranspilerError(msg)\n\u001b[1;32m     63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maction \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwarn\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n",
      "\u001b[0;31mTranspilerError\u001b[0m: \"The control-flow construct 'if_else' is not supported by the backend.\"",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[0;31mTranspilerError\u001b[0m                           Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[29], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m task \u001b[38;5;241m=\u001b[39m \u001b[43mlocal_simulator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcircuit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshots\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      2\u001b[0m results \u001b[38;5;241m=\u001b[39m task\u001b[38;5;241m.\u001b[39mresult()\n\u001b[1;32m      3\u001b[0m plot_histogram(results\u001b[38;5;241m.\u001b[39mget_counts())\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit_braket_provider/providers/braket_backend.py:134\u001b[0m, in \u001b[0;36mBraketLocalBackend.run\u001b[0;34m(self, run_input, **options)\u001b[0m\n\u001b[1;32m    132\u001b[0m verbatim \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mverbatim\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m    133\u001b[0m gateset \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_gateset() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m verbatim \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 134\u001b[0m circuits: \u001b[38;5;28mlist\u001b[39m[Circuit] \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m    135\u001b[0m     to_braket(circ, gateset, verbatim) \u001b[38;5;28;01mfor\u001b[39;00m circ \u001b[38;5;129;01min\u001b[39;00m convert_input\n\u001b[1;32m    136\u001b[0m ]\n\u001b[1;32m    138\u001b[0m shots \u001b[38;5;241m=\u001b[39m options[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshots\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshots\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m options \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m1024\u001b[39m\n\u001b[1;32m    139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m shots \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit_braket_provider/providers/braket_backend.py:135\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    132\u001b[0m verbatim \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mverbatim\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m    133\u001b[0m gateset \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_gateset() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m verbatim \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    134\u001b[0m circuits: \u001b[38;5;28mlist\u001b[39m[Circuit] \u001b[38;5;241m=\u001b[39m [\n\u001b[0;32m--> 135\u001b[0m     \u001b[43mto_braket\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcirc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgateset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mverbatim\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m circ \u001b[38;5;129;01min\u001b[39;00m convert_input\n\u001b[1;32m    136\u001b[0m ]\n\u001b[1;32m    138\u001b[0m shots \u001b[38;5;241m=\u001b[39m options[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshots\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshots\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m options \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m1024\u001b[39m\n\u001b[1;32m    139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m shots \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit_braket_provider/providers/adapter.py:435\u001b[0m, in \u001b[0;36mto_braket\u001b[0;34m(circuit, basis_gates, verbatim)\u001b[0m\n\u001b[1;32m    431\u001b[0m braket_circuit \u001b[38;5;241m=\u001b[39m Circuit()\n\u001b[1;32m    432\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m verbatim \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m {gate\u001b[38;5;241m.\u001b[39mname \u001b[38;5;28;01mfor\u001b[39;00m gate, _, _ \u001b[38;5;129;01min\u001b[39;00m circuit\u001b[38;5;241m.\u001b[39mdata}\u001b[38;5;241m.\u001b[39missubset(\n\u001b[1;32m    433\u001b[0m     basis_gates\n\u001b[1;32m    434\u001b[0m ):\n\u001b[0;32m--> 435\u001b[0m     circuit \u001b[38;5;241m=\u001b[39m \u001b[43mtranspile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcircuit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbasis_gates\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbasis_gates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimization_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    437\u001b[0m \u001b[38;5;66;03m# Verify that ParameterVector would not collide with scalar variables after renaming.\u001b[39;00m\n\u001b[1;32m    438\u001b[0m _validate_name_conflicts(circuit\u001b[38;5;241m.\u001b[39mparameters)\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/compiler/transpiler.py:428\u001b[0m, in \u001b[0;36mtranspile\u001b[0;34m(circuits, backend, basis_gates, inst_map, coupling_map, backend_properties, initial_layout, layout_method, routing_method, translation_method, scheduling_method, instruction_durations, dt, approximation_degree, timing_constraints, seed_transpiler, optimization_level, callback, output_name, unitary_synthesis_method, unitary_synthesis_plugin_config, target, hls_config, init_method, optimization_method, ignore_backend_supplied_default_methods)\u001b[0m\n\u001b[1;32m    400\u001b[0m         instruction_durations \u001b[38;5;241m=\u001b[39m _parse_instruction_durations(\n\u001b[1;32m    401\u001b[0m             backend, instruction_durations, dt, circuits[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m    402\u001b[0m         )\n\u001b[1;32m    404\u001b[0m pm \u001b[38;5;241m=\u001b[39m generate_preset_pass_manager(\n\u001b[1;32m    405\u001b[0m     optimization_level,\n\u001b[1;32m    406\u001b[0m     backend\u001b[38;5;241m=\u001b[39mbackend,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    426\u001b[0m     _skip_target\u001b[38;5;241m=\u001b[39m_skip_target,\n\u001b[1;32m    427\u001b[0m )\n\u001b[0;32m--> 428\u001b[0m out_circuits \u001b[38;5;241m=\u001b[39m \u001b[43mpm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcircuits\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    429\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, circ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(output_name, out_circuits):\n\u001b[1;32m    430\u001b[0m     circ\u001b[38;5;241m.\u001b[39mname \u001b[38;5;241m=\u001b[39m name\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/transpiler/passmanager.py:561\u001b[0m, in \u001b[0;36mStagedPassManager.run\u001b[0;34m(self, circuits, output_name, callback)\u001b[0m\n\u001b[1;32m    554\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrun\u001b[39m(\n\u001b[1;32m    555\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    556\u001b[0m     circuits: _CircuitsT,\n\u001b[1;32m    557\u001b[0m     output_name: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m    558\u001b[0m     callback: Callable \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m    559\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m _CircuitsT:\n\u001b[1;32m    560\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_passmanager()\n\u001b[0;32m--> 561\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcircuits\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.conda/envs/qmg/lib/python3.10/site-packages/qiskit/transpiler/passmanager.py:582\u001b[0m, in \u001b[0;36m_replace_error.<locals>.wrapper\u001b[0;34m(*meth_args, **meth_kwargs)\u001b[0m\n\u001b[1;32m    580\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m meth(\u001b[38;5;241m*\u001b[39mmeth_args, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmeth_kwargs)\n\u001b[1;32m    581\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m PassManagerError \u001b[38;5;28;01mas\u001b[39;00m ex:\n\u001b[0;32m--> 582\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m TranspilerError(ex\u001b[38;5;241m.\u001b[39mmessage) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mex\u001b[39;00m\n",
      "\u001b[0;31mTranspilerError\u001b[0m: \"The control-flow construct 'if_else' is not supported by the backend.\""
     ]
    }
   ],
   "source": [
    "task = local_simulator.run(circuit, shots=10)\n",
    "results = task.result()\n",
    "plot_histogram(results.get_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/beegfs/home/lungyi45/.conda/envs/qmg-gpu/lib/python3.8/site-packages/qiskit/visualization/circuit/matplotlib.py:266: FutureWarning: The default matplotlib drawer scheme will be changed to \"iqp\" in a following release. To silence this warning, specify the current default explicitly as style=\"clifford\", or the new default as style=\"iqp\".\n",
      "  self._style, def_font_ratio = load_style(self._style)\n"
     ]
    },
    {
     "data": {
      "image/png": "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W+rDDz/U9u3b1bZtW0nxgVDjxo3l5OSkFi1aaOzYsQoPD5enp6ep91Byt4udOXNGS5cuVe/evU3zHBwcNHv2bJ06dUoVKlSwqLaffvpJ33//vebMmWNqgErS2LFj1aBBA40dO1adO3fm20kAALJAt27ddPv2bX399ddq27Ztmm8dB5A90UMIAOxMo0aN5OLiYuoFlNADKOF2sObNm5v1IEpYL7kBpYsUKWIWBklSq1atJEmBgYEW17Zo0SJ5e3urW7duun79uunf7du31blzZwUFBaVpvwAAAADM0UMIAOyMu7u7GjRooN9++03h4eH666+/FB4ebgqEKleurIIFC2r79u1q166dduzYIQcHh2SfEJbcU0YSbiu7ceOGxbWdOHFC9+7dU+HChVNc58qVKypfvrzF+wYAAADwHwIhALBDLVu21K+//qrdu3fr4MGD8vDwUN26dU3LmzVrph07dph6D1WvXl158+ZNsh9HR8cUj2E0Gi2uy2g0qmDBglq8eHGK61StWtXi/QIAAAAwRyAEIFM1atRIv//+e5rCAWSeli1b6t1339X27dt16NAhNWzYUM7OzqblzZs310svvaTt27crPDw82dvFMkO5cuV0+vRpNWjQQF5eXllyTABA5mrQoIH27dun2NhYa5cCwAo8PDxUoUIFHTp0yNqlIBECIQBmHB0d1apVK9WrV0+1a9dWlSpV5OXlJaPRqLCwMB07dkz79+/X3r17tWPHjkc27vr27asFCxbou+++05AhQwiFspEGDRrIzc1NW7Zs0alTp/Tqq6+aLW/evLliYmL0wQcfSFKWDSLZv39/rV27Vv/3f/+nGTNmJFl+5cqVR95OBgBIPwcHBzVv3lz169dXnTp1VLVqVXl5eclgMCgsLEzHjx/XgQMHtHfvXm3btk0xMTEp7qt79+5aunSpli9frn79+hEKATmEr6+v2rZtq9q1a6t27doqVqyYXF1dFRUVpdDQUB04cEAHDhzQtm3bdO7cuRT34+HhoXXr1qlu3boKCAgwe8otrI9ACICk+Df9IUOGaOjQoSpatGiK61WoUEHdu3eXJF28eFFz5szRt99+qytXrpitlxAGOTg4aPDgwfrll1/0ww8/ZOo5IPVcXV3VqFEjbdu2TZJM4wclqFatmvLly6dff/1Vjo6OyY4flBl69uypgQMHaubMmTp48KA6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",
      "text/plain": [
       "<Figure size 1475.88x451.5 with 1 Axes>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import qiskit.qasm3\n",
    " \n",
    "program = \"\"\"\n",
    "    OPENQASM 3.0;\n",
    "    include \"stdgates.inc\";\n",
    " \n",
    "    input float[64] a;\n",
    "    qubit[3] q;\n",
    "    bit[2] mid;\n",
    "    bit[3] out;\n",
    " \n",
    "    let aliased = q[0:1];\n",
    " \n",
    "    gate my_gate(a) c, t {\n",
    "      gphase(a / 2);\n",
    "      ry(a) c;\n",
    "      cx c, t;\n",
    "    }\n",
    "    gate my_phase(a) c {\n",
    "      ctrl @ inv @ gphase(a) c;\n",
    "    }\n",
    " \n",
    "    my_gate(a * 2) aliased[0], q[{1, 2}][0];\n",
    "    measure q[0] -> mid[0];\n",
    "    measure q[1] -> mid[1];\n",
    " \n",
    "    while (mid == \"00\") {\n",
    "      reset q[0];\n",
    "      reset q[1];\n",
    "      my_gate(a) q[0], q[1];\n",
    "      my_phase(a - pi/2) q[1];\n",
    "      mid[0] = measure q[0];\n",
    "      mid[1] = measure q[1];\n",
    "    }\n",
    " \n",
    "    if (mid[0]) {\n",
    "      let inner_alias = q[{0, 1}];\n",
    "      reset inner_alias;\n",
    "    }\n",
    " \n",
    "    out = measure q;\n",
    "\"\"\"\n",
    "circuit = qiskit.qasm3.loads(program)\n",
    "circuit.draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "ename": "QASM3ParsingError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mParseCancellationException\u001b[0m                Traceback (most recent call last)",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/openqasm3/parser.py:87\u001b[0m, in \u001b[0;36mparse\u001b[0;34m(input_, permissive)\u001b[0m\n\u001b[1;32m     86\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 87\u001b[0m     tree \u001b[38;5;241m=\u001b[39m \u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprogram\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     88\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (RecognitionException, ParseCancellationException) \u001b[38;5;28;01mas\u001b[39;00m exc:\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/openqasm3/_antlr/_4_13/qasm3Parser.py:640\u001b[0m, in \u001b[0;36mqasm3Parser.program\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m131\u001b[39m\n\u001b[0;32m--> 640\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstatement\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    641\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m136\u001b[39m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/openqasm3/_antlr/_4_13/qasm3Parser.py:999\u001b[0m, in \u001b[0;36mqasm3Parser.statement\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    998\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m171\u001b[39m\n\u001b[0;32m--> 999\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mioDeclarationStatement\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1000\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/openqasm3/_antlr/_4_13/qasm3Parser.py:2725\u001b[0m, in \u001b[0;36mqasm3Parser.ioDeclarationStatement\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   2724\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m358\u001b[39m\n\u001b[0;32m-> 2725\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmatch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mqasm3Parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSEMICOLON\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   2726\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m RecognitionException \u001b[38;5;28;01mas\u001b[39;00m re:\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/antlr4/Parser.py:126\u001b[0m, in \u001b[0;36mParser.match\u001b[0;34m(self, ttype)\u001b[0m\n\u001b[1;32m    125\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 126\u001b[0m     t \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_errHandler\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecoverInline\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    127\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuildParseTrees \u001b[38;5;129;01mand\u001b[39;00m t\u001b[38;5;241m.\u001b[39mtokenIndex\u001b[38;5;241m==\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m    128\u001b[0m         \u001b[38;5;66;03m# we must have conjured up a new token during single token insertion\u001b[39;00m\n\u001b[1;32m    129\u001b[0m         \u001b[38;5;66;03m# if it's not the current symbol\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/antlr4/error/ErrorStrategy.py:703\u001b[0m, in \u001b[0;36mBailErrorStrategy.recoverInline\u001b[0;34m(self, recognizer)\u001b[0m\n\u001b[1;32m    702\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrecoverInline\u001b[39m(\u001b[38;5;28mself\u001b[39m, recognizer:Parser):\n\u001b[0;32m--> 703\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecover\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrecognizer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mInputMismatchException\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrecognizer\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/antlr4/error/ErrorStrategy.py:697\u001b[0m, in \u001b[0;36mBailErrorStrategy.recover\u001b[0;34m(self, recognizer, e)\u001b[0m\n\u001b[1;32m    696\u001b[0m     context \u001b[38;5;241m=\u001b[39m context\u001b[38;5;241m.\u001b[39mparentCtx\n\u001b[0;32m--> 697\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ParseCancellationException(e)\n",
      "\u001b[0;31mParseCancellationException\u001b[0m: None",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[0;31mQASM3ParsingError\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[6], line 18\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mqiskit\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mqasm3\u001b[39;00m\n\u001b[1;32m      3\u001b[0m ghz_with_advanced_features \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m      4\u001b[0m \u001b[38;5;124m    OPENQASM 3.0;\u001b[39m\n\u001b[1;32m      5\u001b[0m \n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     16\u001b[0m \u001b[38;5;124m    c = measure q;\u001b[39m\n\u001b[1;32m     17\u001b[0m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[0;32m---> 18\u001b[0m circuit \u001b[38;5;241m=\u001b[39m \u001b[43mqiskit\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mqasm3\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloads\u001b[49m\u001b[43m(\u001b[49m\u001b[43mghz_with_advanced_features\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     19\u001b[0m circuit\u001b[38;5;241m.\u001b[39mdraw(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmpl\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/qiskit/utils/lazy_tester.py:149\u001b[0m, in \u001b[0;36mLazyDependencyManager.require_in_call.<locals>.decorator.<locals>.out\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    146\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(function)\n\u001b[1;32m    147\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mout\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m    148\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrequire_now(feature)\n\u001b[0;32m--> 149\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunction\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/qiskit/qasm3/__init__.py:253\u001b[0m, in \u001b[0;36mloads\u001b[0;34m(program)\u001b[0m\n\u001b[1;32m    250\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mqiskit_qasm3_import\u001b[39;00m\n\u001b[1;32m    252\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 253\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mqiskit_qasm3_import\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprogram\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    254\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m qiskit_qasm3_import\u001b[38;5;241m.\u001b[39mConversionError \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m    255\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QASM3ImporterError(\u001b[38;5;28mstr\u001b[39m(exc)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/qiskit_qasm3_import/api.py:27\u001b[0m, in \u001b[0;36mparse\u001b[0;34m(string)\u001b[0m\n\u001b[1;32m     24\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mparse\u001b[39m(string: \u001b[38;5;28mstr\u001b[39m, \u001b[38;5;241m/\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m QuantumCircuit:\n\u001b[1;32m     25\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Wrapper around :func:`.convert`, which first parses the OpenQASM 3 program into AST form, and\u001b[39;00m\n\u001b[1;32m     26\u001b[0m \u001b[38;5;124;03m    then converts the output to Qiskit format.\"\"\"\u001b[39;00m\n\u001b[0;32m---> 27\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m convert(\u001b[43mopenqasm3\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstring\u001b[49m\u001b[43m)\u001b[49m)\n",
      "File \u001b[0;32m~/.conda/envs/qmg-gpu/lib/python3.8/site-packages/openqasm3/parser.py:89\u001b[0m, in \u001b[0;36mparse\u001b[0;34m(input_, permissive)\u001b[0m\n\u001b[1;32m     87\u001b[0m     tree \u001b[38;5;241m=\u001b[39m parser\u001b[38;5;241m.\u001b[39mprogram()\n\u001b[1;32m     88\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (RecognitionException, ParseCancellationException) \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[0;32m---> 89\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m QASM3ParsingError() \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n\u001b[1;32m     90\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m QASMNodeVisitor()\u001b[38;5;241m.\u001b[39mvisitProgram(tree)\n",
      "\u001b[0;31mQASM3ParsingError\u001b[0m: "
     ]
    }
   ],
   "source": [
    "import qiskit.qasm3\n",
    "\n",
    "ghz_with_advanced_features = \"\"\"\n",
    "    OPENQASM 3.0;\n",
    "\n",
    "    input float[32] n = 5;\n",
    "    bit[n + 1] c;\n",
    "    qubit[n + 1] q;\n",
    "\n",
    "    // Manually create the GHZ state instead of using a subroutine\n",
    "    h q[0];\n",
    "    for int i in [0:n - 1] {\n",
    "        cnot q[i], q[i + 1];\n",
    "    }\n",
    "\n",
    "    c = measure q;\n",
    "\"\"\"\n",
    "circuit = qiskit.qasm3.loads(ghz_with_advanced_features)\n",
    "circuit.draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(), num_shots=1024, num_bits=2>)), metadata={'shots': 1024, 'circuit_metadata': {}})], metadata={'version': 2})\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/beegfs/home/lungyi45/.conda/envs/qmg-n/lib/python3.12/site-packages/qiskit_ibm_runtime/fake_provider/fake_backend.py:468: RuntimeWarning: Aer not found, using qiskit.BasicSimulator and no noise.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from qiskit import QuantumCircuit\n",
    "from qiskit import generate_preset_pass_manager\n",
    "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
    "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
    "\n",
    "# service = QiskitRuntimeService()\n",
    "\n",
    "# 1. A quantum circuit for preparing the quantum state (|00> + |11>)/rt{2}\n",
    "qc = QuantumCircuit(2)\n",
    "qc.h(0)\n",
    "qc.cx(0, 1)\n",
    "qc.measure_all()\n",
    "\n",
    "# Run the sampler job locally using FakeManilaV2\n",
    "backend = FakeManilaV2()\n",
    "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
    "transpiled_qc = pm.run(qc)\n",
    "\n",
    "# You can use a fixed seed to get fixed results.\n",
    "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
    "sampler = Sampler(mode=backend, options=options)\n",
    " \n",
    "result = sampler.run([transpiled_qc]).result()\n",
    "\n",
    "\n",
    "print(result)\n",
    "# print(f\" > Quasi probability distribution: {result.quasi_dists}\")\n",
    "\n",
    "\n",
    "# # 2: Optimize problem for quantum execution.\n",
    "# backend = service.least_busy(operational=True, simulator=False)\n",
    "# pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
    "# isa_circuit = pm.run(bell)\n",
    "\n",
    "# # 3. Execute using the Sampler primitive\n",
    "# sampler = Sampler(mode=backend)\n",
    "# sampler.options.default_shots = 1024  # Options can be set using auto-complete.\n",
    "# job = sampler.run([isa_circuit])\n",
    "# print(f\"Job ID is {job.job_id()}\")\n",
    "# pub_result = job.result()[0]\n",
    "# print(f\"Counts for the meas output register: {pub_result.data.meas.get_counts()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PrimitiveResult([SamplerPubResult(data=DataBin(XXX=BitArray(<shape=(), num_shots=1024, num_bits=6>), ZZZ=BitArray(<shape=(), num_shots=1024, num_bits=2>)), metadata={'shots': 1024, 'circuit_metadata': {}})], metadata={'version': 2})\n"
     ]
    }
   ],
   "source": [
    "from qiskit_aer import AerSimulator\n",
    "from qiskit.circuit import QuantumCircuit\n",
    "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
    "from qiskit_ibm_runtime import Session, SamplerV2 as Sampler\n",
    "from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister\n",
    "import random\n",
    "import numpy as np\n",
    " \n",
    "def controlled_ry(control:int, target:int, digit:float):\n",
    "    qc.cry(np.pi*digit, control, target)\n",
    "\n",
    "random.seed(1)\n",
    "weight_vector = [random.random() for _ in range(8)]\n",
    "qubits = QuantumRegister(6)\n",
    "clbits = ClassicalRegister(6 ,name=\"XXX\")\n",
    "qc = QuantumCircuit(qubits, clbits)\n",
    "\n",
    "def reset_qubit(qubit, cbit):\n",
    "    with qc.if_test((clbits[cbit], 1)):\n",
    "        qc.x(qubit)\n",
    "\n",
    "qc.ry(np.pi * weight_vector[0], 0)\n",
    "qc.x(1)\n",
    "qc.ry(np.pi * weight_vector[2], 2)\n",
    "qc.ry(np.pi * weight_vector[4], 3)\n",
    "qc.cx(0, 1)\n",
    "controlled_ry(1, 2, weight_vector[3])\n",
    "qc.cx(2, 3)\n",
    "controlled_ry(0, 1, weight_vector[1])\n",
    "qc.cx(1, 2)\n",
    "controlled_ry(2, 3, weight_vector[5])\n",
    "\n",
    "# measure atom 1 state:\n",
    "qc.measure(qubits[0:2], clbits[0:2])\n",
    "# measure atom 2 state and save:\n",
    "qc.measure(qubits[2:4], clbits[2:4])\n",
    "\n",
    "# Add a new atom existence ClassicalRegister:\n",
    "atom_existence_CR = ClassicalRegister(bits=clbits[2:4], name=\"ZZZ\")\n",
    "qc.add_register(atom_existence_CR)\n",
    "with qc.if_test((atom_existence_CR, 0)) as else_:\n",
    "    pass\n",
    "with else_:\n",
    "    qc.ry(np.pi * weight_vector[6], 4)\n",
    "    qc.x(5)\n",
    "    qc.cx(4,5)\n",
    "    controlled_ry(4, 5, weight_vector[7])\n",
    "\n",
    "    # reset atom type qubit:\n",
    "    reset_qubit(2, 2)\n",
    "    reset_qubit(3, 3)\n",
    "\n",
    "qc.measure(qubits[4:6], clbits[4:6])\n",
    "\n",
    "# bond type ClassicalRegister:\n",
    "# bond_type_CR = ClassicalRegister(bits=clbits[4:6]) \n",
    "\n",
    "# reset atom and bond\n",
    "for bond_type_qubit, bond_type_clbit in zip([4,5], [4,5]):\n",
    "    reset_qubit(bond_type_qubit, bond_type_clbit)\n",
    "\n",
    "\n",
    "# Run the sampler job locally using AerSimulator.\n",
    "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
    "aer_sim = AerSimulator()\n",
    "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
    "isa_qc = pm.run(qc)\n",
    "with Session(backend=aer_sim) as session:\n",
    "    sampler = Sampler(mode=session)\n",
    "    result = sampler.run([isa_qc]).result()\n",
    "\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['10', '00', '10', '10', '10', '10', '00', '10', '10', '10', '00', '00', '10', '00', '00', '00', '10', '10', '00', '00', '00', '00', '10', '00', '00', '00', '00', '10', '00', '00', '10', '00', '00', '10', '00', '00', '10', '10', '10', '10', '10', '10', '10', '00', '10', '00', '10', '10', '00', '00', '00', '10', '00', '00', '10', '10', '10', '10', '00', '10', '10', '00', '00', '10', '10', '10', '10', '10', '00', '00', '00', '00', '10', '10', '00', '00', '00', '00', '10', '00', '00', '10', '10', '10', '10', '00', '10', '00', '00', '10', '10', '00', '10', '00', '10', '10', '10', '10', '10', '00', '10', '00', '10', '00', '00', '00', '00', '10', '10', '00', '00', '10', '00', '00', '00', '10', '10', '00', '00', '00', '00', '10', '10', '10', '00', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '00', '00', '00', '00', '10', '00', '10', '00', '10', '10', '00', '10', '00', '00', '00', '00', '00', '10', '00', '00', '00', '00', '00', '10', '10', '10', '00', '10', '10', '10', '10', '10', '00', '10', '00', '00', '00', '10', '00', '10', '00', '00', '00', '00', '10', '00', '00', '10', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '00', '10', '00', '10', '11', '10', '10', '00', '00', '00', '00', '00', '00', '00', '00', '10', '10', '00', '00', '10', '10', '00', '10', '00', '00', '00', '10', '00', '10', '00', '10', '00', '00', '00', '10', '10', '00', '00', '00', '10', '00', '10', '00', '10', '00', '00', '00', '00', '10', '10', '00', '00', '10', '00', '00', '00', '10', '10', '00', '00', '00', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '10', '10', '00', '10', '10', '00', '10', '10', '00', '10', '10', '00', '00', '10', '00', '00', '10', '00', '10', '10', '10', '00', '00', '10', '10', '10', '00', '00', '00', '10', '00', '00', '00', '10', '10', '10', '00', '11', '10', '10', '00', '10', '00', '00', '00', '10', '10', '10', '00', '10', '00', '10', '00', '10', '10', '00', '00', '00', '00', '00', '10', '00', '00', '10', '00', '10', '10', '00', '10', '00', '10', '10', '10', '10', '00', '10', '00', '10', '00', '10', '10', '10', '10', '10', '10', '10', '00', '10', '10', '10', '00', '00', '10', '10', '10', '10', '10', '00', '10', '10', '00', '00', '10', '10', '10', '00', '00', '10', '00', '10', '10', '00', '00', '00', '00', '00', '00', '10', '00', '10', '10', '10', '00', '10', '10', '00', '10', '10', '10', '10', '10', '00', '00', '10', '00', '00', '10', '00', '00', '00', '10', '00', '00', '00', '10', '00', '10', '00', '10', '10', '10', '00', '00', '10', '10', '10', '10', '10', '10', '00', '00', '00', '10', '00', '00', '10', '00', '10', '00', '00', '10', '00', '00', '00', '10', '10', '10', '00', '10', '00', '10', '00', '10', '10', '00', '00', '00', '00', '00', '10', '10', '10', '10', '10', '00', '00', '10', '10', '00', '00', '00', '10', '10', '00', '00', '00', '00', '10', '10', '00', '10', '00', '00', '10', '00', '00', '10', '00', '00', '00', '10', '00', '00', '00', '10', '10', '10', '10', '10', '00', '00', '00', '00', '10', '10', '10', '11', '10', '00', '10', '10', '00', '00', '00', '00', '10', '10', '10', '00', '00', '10', '00', '10', '10', '00', '10', '00', '10', '10', '00', '00', '00', '10', '10', '00', '00', '00', '00', '00', '10', '10', '00', '10', '10', '00', '00', '00', '00', '00', '10', '00', '10', '00', '00', '10', '10', '00', '00', '00', '10', '00', '00', '00', '00', '00', '00', '10', '00', '10', '10', '10', '00', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '10', '10', '00', '10', '10', '10', '00', '00', '00', '10', '10', '10', '00', '10', '00', '10', '10', '00', '00', '00', '10', '10', '10', '10', '00', '00', '10', '10', '10', '10', '00', '10', '10', '10', '10', '00', '00', '00', '00', '10', '10', '10', '00', '00', '00', '10', '00', '00', '00', '10', '00', '10', '10', '10', '00', '00', '00', '00', '10', '00', '00', '10', '10', '10', '10', '10', '10', '00', '00', '00', '00', '10', '10', '10', '00', '10', '00', '00', '10', '00', '00', '10', '00', '10', '10', '00', '10', '00', '10', '00', '10', '00', '10', '00', '10', '00', '00', '10', '10', '00', '00', '10', '10', '10', '10', '00', '00', '00', '00', '00', '00', '10', '10', '00', '00', '10', '00', '00', '10', '10', '00', '10', '10', '00', '10', '10', '10', '10', '00', '00', '10', '10', '10', '10', '10', '10', '10', '10', '10', '00', '10', '10', '10', '10', '00', '10', '00', '00', '11', '10', '00', '00', '00', '00', '00', '10', '10', '00', '10', '10', '00', '00', '10', '10', '10', '00', '00', '10', '10', '10', '10', '10', '00', '10', '10', '10', '10', '10', '10', '00', '10', '00', '10', '10', '10', '10', '00', '00', '00', '00', '10', '10', '10', '10', '10', '10', '00', '10', '00', '10', '00', '10', '10', '00', '00', '10', '00', '00', '10', '00', '00', '10', '10', '10', '00', '10', '10', '10', '00', '10', '10', '10', '00', '10', '10', '00', '00', '00', '00', '10', '00', '00', '00', '10', '00', '10', '00', '00', '00', '10', '10', '00', '10', '00', '10', '00', '00', '10', '00', '00', '00', '00', '10', '10', '10', '10', '00', '10', '00', '00', '10', '10', '00', '10', '00', '10', '10', '00', '00', '00', '10', '00', '10', '00', '10', '10', '10', '10', '10', '00', '00', '10', '00', '00', '00', '10', '00', '00', '00', '10', '00', '10', '10', '10', '00', '10', '11', '10', '10', '10', '00', '00', '00', '10', '00', '10', '10', '10', '10', '10', '10', '10', '10', '10', '00', '10', '10', '00', '00', '00', '00', '00', '00', '00', '00', '10', '00', '00', '00', '00', '00', '10', '10', '10', '10', '10', '00', '00', '00', '10', '10', '10', '10', '00', '00', '10', '10', '00', '10', '00', '10', '00', '10', '00', '10', '10', '00', '10', '00', '10', '00', '00', '10', '00', '00', '00', '00', '10', '00', '10', '10', '10', '10', '10', '10', '10', '00', '10', '00', '10', '00', '00', '10', '10', '10', '00', '10', '00', '00', '00', '00', '00', '00', '00', '10', '10', '10', '10', '10', '00', '10', '10', '00', '10', '00', '10', '10', '00', '00', '10', '10', '00', '10', '00', '10', '10', '00', '00', '00', '10', '10', '10', '00', '00', '10', '10', '10', '10', '00', '00', '10', '10', '00', '00', '00', '10', '00', '10', '10', '00', '00', '00', '10', '10']\n"
     ]
    }
   ],
   "source": [
    "x = result[0].data.ZZZ\n",
    "print(x.get_bitstrings())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "qmg",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
